﻿#include <iostream>
#include <string>
#include <vector>
using namespace std;


int findFirstUniqueChar(const string& str) 
{
	/* 通过映射找到只出现一次的第一个字符 */
	int count[26] = { 0 };
	for (char c : str) {
		if (c >= 'a' && c <= 'z')
		{
			count[c - 'a']++;
		}
	}
	/* 返回下标 */
	for (int i = 0; i < str.size(); i++)
	{
		char c = str[i];
		if (c >= 'a' && c <= 'z' && count[c - 'a'] == 1)
		{
			return i;
		}
	}

	return -1;
}


void string_test_1()
{
	string s = "hello world";

	int index = findFirstUniqueChar(s);
	cout << index << ' ' << s[index] << endl;
	/* 下标 */
	for (int i = 0; i < s.size(); i++)
	{
		cout << s[i] << " ";
	}
	cout << endl;

	/* 
	string实现的比较冗余，不仅实现了迭代器的重载
		iterator begin();
		const_iterator begin() const;

		iterator end();
		const_iterator end() const;

		reverse_iterator rbegin();
		const_reverse_iterator rbing() const;

		reverse_iterator rout();
		const_reverse_iterator rend() const;

		在c++11中又新增了cbegin,cend,crbegin,crend;
	/* 迭代器 */
	string::iterator it = s.begin();
	//auto it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	/* 反向迭代器 */
	//auto it1 = s.rbegin();
	string::reverse_iterator it1 = s.rbegin();
	while (it1 != s.rend())
	{
		cout << *it1 << ' ';
		it1++;
	}
	cout << endl;

	/* 范围for */
	for (auto it1 : s)
	{
		cout << it1 << " ";
	}

}

/* 计算字符串最后一个单词的长度，单词以空格隔开，字符串长度小于5000。（注：字符串末尾不以空格为结尾） 
*/

int calculate_size(const string& str)
{
	int count = 0;
	size_t index = 0;
	int blank = 0;
	auto it = str.rbegin();

	while (it != str.rend())
	{
		if (*it == ' ')
		{
			/* 返回逆置字符串遇到第一个空格下标 */
			index = str.size() - blank;
			//cout << index << endl;
			break;
		}
		it++;
		blank++;
	}

	while (str[index] != '\0')
	{
		count++;
		index++;
	}
	return count;
}

void string_test_2()
{
	string str = "hello nowcoder";
	cin >> str;
	cout << str;
	cout << calculate_size(str);

}

//string addStrings(string num1, string num2) {
//	int size1 = num1.size() - 1;
//	int size2 = num2.size() - 1;
//	int multiplier1 = 1;
//	int multiplier2 = 1;
//	int num1_i = 0;
//	int num2_i = 0;
//	int m = 0;
//	int n = 0;
//	string num;
//	while (size1--)
//	{
//		multiplier1 *= 10;
//	}
//
//	while (size2--)
//	{
//		multiplier2 *= 10;
//	}
//	cout << multiplier1 << ' ' << multiplier2 << endl;
//	for (auto it : num1)
//	{
//		num1_i = it - '0';
//		cout << num1_i << ' ' << multiplier1 << endl;
//		m = num1_i* multiplier1 + m;
//		multiplier1 /= 10;
//		it++;
//	}
//	for (auto it : num2)
//	{
//		num2_i = it - '0';
//		n = num2_i * multiplier2 + n;
//		multiplier2 /= 10;
//		it++;
//	}
//	cout << m + n;
//	//num
//	num = m + n;
//	return num;
//}

string addStrings(string num1, string num2) {
	string result;
	int carry = 0;
	int i = num1.size() - 1;
	int j = num2.size() - 1;

	while (i >= 0 || j >= 0 || carry) {
		int sum = carry;
		if (i >= 0) {
			sum += num1[i] - '0'; 
			i--;
		}
		if (j >= 0) {
			sum += num2[j] - '0';
			j--;
		}
		
		carry = sum / 10;
		cout << sum << ' ' << carry << endl;
		result.push_back(sum % 10 + '0'); 
		cout << sum  << endl;
	}

	reverse(result.begin(), result.end());
	return result;
}

//int myAtoi(string str) 
//{
//	int index = 0;
//	long long flag = 1;
//	int sum = 0;
//	for (auto it : str)
//	{
//		//"  -42"
//		if (it == '-')
//		{
//			break;
//		}
//		if (it > '0' && it <= '9')
//		{
//			/*if(it != '0')*/
//			break;
//		}
//		if (it == '+')
//		{
//			index++;
//			break;
//		}
//
//		if (it != ' ' && it != '0')
//		{
//			return 0;
//		}
//
//		it++;
//		index++;
//	}
//
//	if (str[index] == '\0')
//	{
//		return 0;
//	}
//	if (str[index] == '-')
//	{
//		flag = -1;
//		index++;
//	}
//
//	while (str[index] == '0' || str[index] == '+' || str[index] == '-')
//	{
//		if (str[index] == '-')
//			flag = -1;
//		index++;
//	}
//	for (int i = index + 1; (str[i] >= '0' && str[i] <= '9'); i++)
//	{
//		flag *= 10;
//	}
//
//	if (flag > INT_MAX) return INT_MAX;
//	if (flag < INT_MIN) return INT_MIN;
//
//	while (str[index] >= '0' && str[index] <= '9')
//	{
//		sum += flag * (str[index] - '0');
//		flag /= 10;
//		index++;
//	}
//	
//	return sum;
//}

int myAtoi(const std::string& str) {
	int index = 0;
	int sign = 1;
	long long result = 0;
	int n = str.size();

	while (index < n && str[index] == ' ') {
		index++;
	}

	if (index < n && (str[index] == '+' || str[index] == '-')) {
		sign = (str[index] == '-') ? -1 : 1;
		index++;
	}

	while (index < n && str[index] >= '0' && str[index] <= '9') {
		result = result * 10 + (str[index] - '0');

		if (result > INT_MAX) {
			return (sign == 1) ? INT_MAX : INT_MIN;
		}

		index++;
	}

	// 返回结果
	return static_cast<int>(result * sign);
}
void string_test_3()
{
	string num1 = "  -42";
	string num2 = "+-2";
	//cout << addStrings(num1, num2);
	cout << myAtoi(num2);
}

int main1()
{
	string_test_3();
	return 0;
}

int main2()
{
	string str = "Hello Bit.";
	string::iterator it = str.begin();

	while (it != str.end())
	{
		if (*it != ' ')
			cout << *it;
		else
			str.erase(it);
		it++;
	}
	return 0;
}

int main3(int argc, char* argv[])

{
	string strText = "How are you?";
	string strSeparator = " ";
	string strResult;
	int size_pos = 0;
	int size_prev_pos = 0;

	while ((size_pos = strText.find_first_of(strSeparator, size_pos)) != string::npos)
	{
		strResult = strText.substr(size_prev_pos, size_pos - size_prev_pos);
		cout << strResult << " ";
		size_prev_pos = ++size_pos;
	}

	if (size_prev_pos != strText.size())
	{
		strResult = strText.substr(size_prev_pos, size_pos - size_prev_pos);
		cout << strResult << " ";
	}

	cout << endl;

	return 0;

}

void main4()

{

	string s1 = "hello world";
	string s2 = "change world";
	string::iterator it = s1.begin();
	swap(s1, s2);
	while (it != s1.end())
		cout << *it;

	cout << endl;

}

int main5()
{
	string str("Hello Bit.");
	str.reserve(111);
	str.resize(5);
	str.reserve(50);
	cout << str.size() << ":" << str.capacity() << endl;

	return 0;

}

int main(int argc, char* argv[])

{
	string a = "hello world";
	string b = a;
	if (a.c_str() == b.c_str())
	{
		cout << "true" << endl;
	}
	else cout << "false" << endl;

	cout << a.c_str() << ' ' << b.c_str() << endl;

	string c = b;
	c = "";
	if (a.c_str() == b.c_str())
	{
		cout << "true" << endl;
	}
	else cout << "false" << endl;

	a = "";
	if (a.c_str() == b.c_str())
	{
		cout << "true" << endl;
	}
	else cout << "false" << endl;

	return 0;

}